package controleur;

import java.awt.Dimension;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import modele.CarnetDeCommandes;
import modele.CarnetDeLivraisons;
import modele.Commande;
import modele.Livraison;
import modele.RestaurantCommande;

import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import vue.Panneau_Livreur;

public class EnregistrerLivraison {
	
	private static Livraison livraisonTemp;
	
	/**
	 * Démarre la livraison et ouvre le panneau du livreur
	 * @return Le panneau du livreur - Panneau_Livreur
	 */
	public static JPanel demarrerLivraison() {
		final Panneau_Livreur panneau = new Panneau_Livreur(new Dimension(600, 450));
		livraisonTemp = new Livraison();
		return panneau;
	}
	
	/**
	 * Termine la livraison en cours
	 * @param index - int
	 */
	public static void accepterLivraison(int index) {
		CarnetDeCommandes.getInstance().get(index).prendreEnCharge();
		livraisonTemp.setDateAccepte(new Date());
		CarnetDeLivraisons.getInstance().add(livraisonTemp);
		livraisonTemp = new Livraison();
	}
	
	/**
	 * 
	 * @return false s'il n'est pas possible d'accepter la commande
	 */
	public static boolean verifierPossibiliteAccepter() {
		boolean complet = false;
		if (livraisonTemp.getEmplacementDepart() != "" && livraisonTemp.getCommande() != null) {
			if (!livraisonTemp.getCommande().estPrisEnCharge()) {
				complet = true;
			}
		}
		return complet;
	}
	
	/**
	 * Génère le trajet avec l'API de Google. 
	 * @see http://www.developerfusion.com/code/2064/a-simple-way-to-read-an-xml-file-in-java/
	 * @param index
	 * @param adresseDepart
	 * @return La carte du trajet généré - JLabel 
	 * <p>S'il y a une erreur, on retourne un message d'avertissement.</p>
	 */
	public static JLabel genererTrajet(int index, String adresseDepart) {
		JLabel labelDeRetour = new JLabel("Le trajet n'a pas été correctement transmit. Veuillez réessayer.");
		if (adresseDepart != "" || adresseDepart != "Entrez votre adresse ici") {
			livraisonTemp.setEmplacementDepart("");
			Commande commande = CarnetDeCommandes.getInstance().get(index);
			try {
				DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
	            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
	            
	            String urlXML = "http://maps.googleapis.com/maps/api/directions/xml?origin="
									+convertAdresse(adresseDepart)+"&destination="
									+convertAdresse(commande.getAdresseLivraison())+"&waypoints=optimize:true";
	            for (RestaurantCommande restaurantCommande : commande.getListeRestaurantCommande()) {
	            	urlXML += "|"+convertAdresse(restaurantCommande.getRestaurant().getAdresse());
				}
	            urlXML += "&sensor=false";
	            org.w3c.dom.Document doc = docBuilder.parse(new URL(urlXML).openStream());
	            //System.out.println(urlXML);
	            doc.getDocumentElement().normalize();
	            
				if (doc.getElementsByTagName("route").getLength() > 0) {
					livraisonTemp.setEmplacementDepart(adresseDepart);
					livraisonTemp.setCommande(CarnetDeCommandes.getInstance().get(index));
					Element route = (Element)doc.getElementsByTagName("route").item(0);
					String urlMap = "http://maps.googleapis.com/maps/api/staticmap?size=600x300&path=weight:3%7Ccolor:red%7Cenc:"
											+(((Element) route.
													getElementsByTagName("overview_polyline").item(0)).
													getElementsByTagName("points").item(0)).getChildNodes().item(0).getNodeValue().trim()
											+"&markers=color:red%7C"
											+((Element)((Element)route.
													getElementsByTagName("leg").item(0)).
													getElementsByTagName("start_location").item(0)).
													getElementsByTagName("lat").item(0).
													getChildNodes().item(0).getNodeValue().trim()
											+","
											+((Element)((Element)route.
													getElementsByTagName("leg").item(0)).
													getElementsByTagName("start_location").item(0)).
													getElementsByTagName("lng").item(0).
													getChildNodes().item(0).getNodeValue().trim();
					int iTotal = commande.getListeRestaurantCommande().size();
					for (int i = 1; i <= iTotal; i++) {
						urlMap += "&markers=color:blue%7Clabel:"+i+"%7C"
										+((Element)((Element)route.
												getElementsByTagName("leg").item(i)).
												getElementsByTagName("start_location").item(0)).
												getElementsByTagName("lat").item(0).
												getChildNodes().item(0).getNodeValue().trim()
										+","
										+((Element)((Element)route.
												getElementsByTagName("leg").item(i)).
												getElementsByTagName("start_location").item(0)).
												getElementsByTagName("lng").item(0).
												getChildNodes().item(0).getNodeValue().trim();
					}
					urlMap += "&markers=color:yellow%7Clabel:D%7C"
									+((Element)((Element)route.
											getElementsByTagName("leg").item(iTotal)).
											getElementsByTagName("end_location").item(((Element)route.getElementsByTagName("leg").item(iTotal)).getElementsByTagName("end_location").getLength()-1)).
											getElementsByTagName("lat").item(0).
											getChildNodes().item(0).getNodeValue().trim()
									+","
									+((Element)((Element)route.
											getElementsByTagName("leg").item(iTotal)).
											getElementsByTagName("end_location").item(((Element)route.getElementsByTagName("leg").item(iTotal)).getElementsByTagName("end_location").getLength()-1)).
											getElementsByTagName("lng").item(0).
											getChildNodes().item(0).getNodeValue().trim()
									+"&sensor=false";
					labelDeRetour = new JLabel(new ImageIcon(ImageIO.read(new URL(urlMap).openStream())));
				}
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (SAXException e) {
				e.printStackTrace();
			}
		} else {
			labelDeRetour = new JLabel("Vous devez entrer votre emplacement de départ.");
		}
		return labelDeRetour;
	}
	
	/**
	 * Remplace les " " d'une texte par "+" 
	 * @param adresse - String
	 * @return Le texte converti - String
	 */
	private static String convertAdresse(String adresse) {
		if (adresse.contains(" ")) {
			String[] infosAdresse = adresse.split(" ");
			adresse = "";
			for (String i : infosAdresse) {
				adresse += URLEncoder.encode(i);
				if (i != infosAdresse[infosAdresse.length-1]) {
					adresse += "+";
				} else {
					adresse += ",QC";
				}
			}
		}
		return adresse;
	}
}